package team.api;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import team.item.MemberItem;


public class Member {

	static Logger logger = Logger.getLogger(Member.class);

	private static final String TABLE = "member";

	public int insertMember(String user_id, String user_pw, String hp_number, String email) {

		// ---------------------------------------------
		// 메서드 시작
		// ---------------------------------------------
		logger.debug("=========== method start >> insertMember");
		logger.debug("[PARAMS] user_id=" + user_id);
		logger.debug("[PARAMS] user_pw=" + user_pw);
		logger.debug("[PARAMS] hp_number=" + hp_number);
		logger.debug("[PARAMS] email=" + email);



		// SQL 인젝션 방어
		user_id = user_id.replace("'", "\'");
		user_pw = user_pw.replace("'", "\'");
		hp_number = hp_number.replace("'", "\'");
		email = email.replace("'", "\'");


		// ---------------------------------------------
		// 로직 구현
		// ---------------------------------------------
		// 테이블이 자동 증가가 아니므로,
		// 최대값 + 1 형식으로 메서드 안에서 생성한다.

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO Member("
				+ "user_id, user_pw, hp_number, email, reg_date, edit_date"
				+ ") VALUES (" + "'%s', '%s', '%s', '%s'," + " now(), now());";

		boolean result = DBHandler.execSql(sql, user_id, user_pw, hp_number,
				email);
		int seq = 0;

		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------
		if (result) {
			DBHandler.commit();
			 seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 교수 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("=========== method end >> insertMember");

		return seq;
	}

	public boolean updateMember(int seq, String user_id, String user_pw, String hp_number, String email) {

		// ---------------------------------------------
		// 메서드 시작
		// ---------------------------------------------
		logger.debug("=========== method start >> updateMember");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] user_id=" + user_id);
		logger.debug("[PARAMS] user_pw=" + user_pw);
		logger.debug("[PARAMS] hp_number=" + hp_number);
		logger.debug("[PARAMS] email=" + email);


		// 리턴할 값 선언
		boolean result = false;

		// SQL 인젝션 방어
		user_id = user_id.replace("'", "\'");
		user_pw = user_pw.replace("'", "\'");
		hp_number = hp_number.replace("'", "\'");
		email = email.replace("'", "\'");


		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "UPDATE Member SET " + "user_id='%s'," + "user_pw='%s',"
				+ "hp_number='%s'," + "email='%s'," + "edit_date=now()";

		result = DBHandler.execSql(sql, seq, user_id, user_pw, hp_number,
				email);

		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------
		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 학생 수정 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 수정 실패");
		}

		logger.debug("=========== method end >> updateMember");

		return result;
	}

	public boolean deleteMember(int seq) {
		logger.debug("=========== method start >> deleteMember");
		logger.debug("[PARAMS] seq=" + seq);

		boolean result = false;

		DBHandler.beginTrans();

		String sql = "DELETE FROM Member WHERE seq=%d";
		result = DBHandler.execSql(sql, seq);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 학생 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("=========== method end >> deleteMember");
		return result;
	}

	public MemberItem selectMember(int seq) {
		logger.debug("============ method start >> selectMember");
		logger.debug("[PARAMS] seq=" + seq);

		MemberItem item = null;

		// 데이터 조회
		String sql = "SELECT seq, user_id, user_pw, hp_number, email, reg_date, edit_date FROM member WHERE seq = %d";

		ResultSet rs = DBHandler.getResult(sql, seq);

		if (rs != null) {
			// 데이터 조회 겨과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출

				int sno = rs.getInt(1);
				String user_id = rs.getString(2);
				String user_pw = rs.getString(3);
				String hp_number = rs.getString(4);
				String email = rs.getString(5);
				String reg_date = rs.getString(6);
				String edit_date = rs.getString(7);
				

				// 2) 추출된 값을 객체로 구성
				item = new MemberItem(sno, user_id, user_pw, hp_number, 
						email, reg_date, edit_date);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}

		logger.debug("================ method end >> selectMember");

		return item;

	}


	public ArrayList<MemberItem> selectMemberList() {
		logger.debug("============ method start >> selectMemberList");

		ArrayList<MemberItem> list = null;

		String sql = "SELECT seq, user_id, user_pw, hp_number, "
				+ "email, reg_date, edit_date FROM member";



		ResultSet rs = DBHandler.getResult(sql);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {

				list = new ArrayList<MemberItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출

					int sno = rs.getInt(1);
					String user_id = rs.getString(2);
					String user_pw = rs.getString(3);
					String hp_number = rs.getString(4);
					String email = rs.getString(5);
					String reg_date = rs.getString(6);
					String edit_date = rs.getString(7);

					// 2) 추출된 값을 객체로 구성
					MemberItem item = new MemberItem(sno, user_id, user_pw, 
							hp_number, email, reg_date, edit_date);

					// 3) ArrayList에 추가
					list.add(item);

				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}

		logger.debug("================ method end >> selectMemberList");

		return list;

	}

	/**
	 * 
	 * @param email
	 * 				- 이메일
	 * @param hp
	 * 				- 핸드폰 번호
	 * @return   true - 아이디 찾기 성공 / false - 아이디 찾기 실패
	 */
	public MemberItem id_search(String user_id) {
		logger.debug("============ method start >> selectMember");
		logger.debug("[PARAMS] seq=" + user_id);


		MemberItem item = null;

		// 데이터 조회
		String sql = "SELECT user_id FROM member WHERE hp_number = '%s' and email = '%s'";

		ResultSet rs = DBHandler.getResult(sql, user_id);


		if (rs != null) {
			// 데이터 조회 겨과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출


				int seq = rs.getInt(1);
				String user_id1 = rs.getString(2);
				String user_pw = rs.getString(3);
				String hp_number = rs.getString(4);
				String email = rs.getString(5);
				String reg_date = rs.getString(6);
				String edit_date = rs.getString(7);

				

				// 2) 추출된 값을 객체로 구성
				item = new MemberItem(seq, user_id1, user_pw, hp_number, 
						email, reg_date, edit_date);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}

		logger.debug("================ method end >> selectMember");

		return item;

	}
	
	/** 
	 * @param id
	 * 				-  아이디
	 * @param email
	 * 				-  이메일
	 * @param hp
	 * 				-  핸드폰 번호
	 * @return      true - 비밀번호 찾기 성공 / false - 비밀번호 찾기 실패
	 */
	public MemberItem pw_search(String user_pw) {
		logger.debug("============ method start >> selectMember");
		logger.debug("[PARAMS] user_pw=" + user_pw);


		MemberItem item = null;

		// 데이터 조회
		String sql = "SELECT user_pw FROM Member WHERE user_id = '%s' and hp_number = '%s' and email = '%s'";

		ResultSet rs = DBHandler.getResult(sql, user_pw);


		if (rs != null) {
			// 데이터 조회 겨과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출


				int seq = rs.getInt(1);
				String user_id = rs.getString(2);
				String user_pw1 = rs.getString(3);
				String hp_number = rs.getString(4);
				String email = rs.getString(5);
				String reg_date = rs.getString(6);
				String edit_date = rs.getString(7);

				

				// 2) 추출된 값을 객체로 구성
				item = new MemberItem(seq, user_id, user_pw1, hp_number, 
						email, reg_date, edit_date);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}

		logger.debug("================ method end >> selectMember");

		return item;

	}
	
	/**
	 * 
	 * @param user_id 
	 *               - 회원 아이디
	 * @param user_pw 
	 *               - 회원 비밀번호
	 * @return  회원 로그인
	 */
	public boolean login(String user_id, String user_pw) {
        boolean result = false;
        
		logger.debug("============ method start >> login");
		
		logger.debug("user_id: " + user_id);
		logger.debug("user_pw: " + user_pw);
	
		
		logger.debug("============ method end >> login");

		return result;

    }
	
	/**
	 * 
	 * @return  회원 로그아웃
	 */
	public boolean logout() {
        boolean result = false;
        
		logger.debug("============ method start >> login");

		logger.debug("============ method end >> login");

		return result;

}
}
